// API请求工具 - 适配uni-app环境
import { getToken } from './auth'

// 基础地址：H5 使用代理，小程序使用绝对地址
let baseURL = ''
// #ifdef H5
baseURL = '/api'
// #endif
// #ifndef H5
baseURL = import.meta.env.VITE_BASE_API || 'http://192.168.11.133:8080'
// #endif

interface RequestConfig {
  url: string;
  method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
  data?: any;
  params?: any;
  header?: Record<string, string>;
  timeout?: number;
}

// 防重复提交存储
const pendingRequests = new Map<string, number>();

// 转换参数为查询字符串
function tansParams(params: any): string {
  let result = '';
  Object.keys(params).forEach(key => {
    if (params[key] !== undefined && params[key] !== null) {
      result += key + '=' + encodeURIComponent(params[key]) + '&';
    }
  });
  return result;
}

export function request(config: RequestConfig): Promise<any> {
  return new Promise((resolve, reject) => {
    
    // 检查防重复提交配置
    const isRepeatSubmit = (config.header || {}).repeatSubmit === 'false';
    
    // 处理 GET/PUT 请求的 params 参数
    // 支持绝对地址：当传入的 url 已是 http(s) 开头时，不再拼接 baseURL
    let requestUrl = config.url.startsWith('http') ? config.url : baseURL + config.url;
    let requestData = config.data;
    
    // 处理 params 参数（GET和PUT请求都支持）
    if (config.params && (config.method === 'GET' || config.method === 'PUT')) {
      let url = requestUrl + '?' + tansParams(config.params);
      url = url.slice(0, -1);
      requestUrl = url;
    }
    
    // 防重复提交验证（仅对POST和PUT请求）
    if (!isRepeatSubmit && (config.method === 'POST' || config.method === 'PUT')) {
      const requestObj = {
        url: config.url,
        data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data,
        time: new Date().getTime()
      };
      
      const requestSize = Object.keys(JSON.stringify(requestObj)).length; // 请求数据大小
      const limitSize = 5 * 1024 * 1024; // 限制存放数据5M
      
      if (requestSize >= limitSize) {
        console.warn(`[${config.url}]: ` + '请求数据大小超出允许的5M限制，无法进行防重复提交验证。');
      } else {
        const requestKey = `${config.method}_${config.url}_${JSON.stringify(config.data)}`;
        const lastRequestTime = pendingRequests.get(requestKey);
        const currentTime = new Date().getTime();
        
        if (lastRequestTime && (currentTime - lastRequestTime) < 1000) { // 1秒内重复请求
          uni.showToast({
            title: '请勿重复提交',
            icon: 'none',
            duration: 2000
          });
          reject(new Error('请勿重复提交'));
          return;
        }
        
        pendingRequests.set(requestKey, currentTime);
        
        // 清理过期的请求记录（5秒后自动清理）
        setTimeout(() => {
          pendingRequests.delete(requestKey);
        }, 5000);
      }
    }
    
    uni.request({
      url: requestUrl,
      method: config.method || 'GET',
      data: requestData,
      header: {
        'Content-Type': 'application/json;charset=utf-8',
        'Authorization': 'Bearer ' + getToken(),
        ...config.header
      },
      timeout: config.timeout || 15000,
      success: (res: any) => {
        
        if (res.statusCode === 200) {
          // 处理业务逻辑
          const code = res.data.code || 200;
          const msg = res.data.msg || '请求成功';
          
          if (code === 200) {
            resolve(res.data);
          } else if (code === 401) {
            uni.showToast({
              title: '登录状态已过期，请重新登录',
              icon: 'none',
              duration: 2000
            });
            setTimeout(() => {
              uni.reLaunch({
                url: '/pages/login/login'
              });
            }, 2000);
            reject(new Error('登录状态已过期'));
          } else {
            // 业务逻辑错误，但仍然resolve，让调用方处理
            resolve(res.data);
          }
        } else {
          reject(res);
        }
      },
      fail: (err: any) => {
        console.log('请求错误:', err);
        let message = '网络请求失败';
        
        if (err.errMsg) {
          if (err.errMsg.includes('timeout')) {
            message = '请求超时';
          } else if (err.errMsg.includes('fail')) {
            message = '网络连接失败';
          }
        }
        
        uni.showToast({ title: message, icon: 'none', duration: 3000 });
        reject(err);
      }
    });
  });
}

// 导出默认的request函数
export default request; 